const { existsSync, mkdirSync } = require("fs");
const { exec } = require("child_process");
const md5 = require("md5");
const { output } = require("../config/config");

/**
 * 检查是否存在路径filePath，不存在则创建
 * @param filePath 路径
 */
function createOutputDir(filePath) {
  if (filePath === "") {
    console.log("请指定输出输出目录");
  }
  if (!existsSync(filePath)) {
    mkdirSync(filePath);
  }
}

/**
 * 判断本地是否存在仓库文件。不存在进行clone，存在进行pull
 * 注意：需保证output路径存在
 * @param repoInfo
 * @param output
 * @returns {Promise<unknown>}
 */
function cloneOrPull(repoInfo, output) {
  const { gitlab_clone_url } = repoInfo;
  return new Promise((resolve, reject) => {
    console.log(`同步仓库${repoInfo.gitlab_name}至vcs-${md5(gitlab_clone_url)}`);
    if (!existsSync(`${output}/vcs-${md5(gitlab_clone_url)}`)) {
      //不存在，clone项目
      exec(
        `git clone http://gitlab2.bitautotech.com${gitlab_clone_url}.git vcs-${md5(
          gitlab_clone_url
        )}`,
        {
          cwd: output,
        },
        (err, stdout, stderr) => {
          if (err !== null) {
            console.log(`仓库${repoInfo.gitlab_name}同步失败`, err);
            reject({
              error: stderr,
            });
            return;
          }
          console.log(`仓库${repoInfo.gitlab_name}同步完成`);
          resolve();
        }
      );
    } else {
      //存在，pull项目
      exec(
        `git pull -p`,
        { cwd: `${output}/vcs-${md5(gitlab_clone_url)}` },
        function (err, stdout, stderr) {
          if (err !== null) {
            console.log(`仓库${repoInfo.gitlab_name}同步失败`, err);
            reject({
              error: stderr,
            });
            return;
          }
          console.log(`仓库${repoInfo.gitlab_name}同步完成`);
          resolve({
            repoInfo,
            stdout,
            stderr,
          });
        }
      );
    }
  });
}

/**
 * 统计指定日期的仓库统计数据
 * @param cmd  命令
 * @param cwd  执行命令是所在的路径（必须存在，否则抛出错误）
 * @returns {Promise<unknown>}
 */
function execAsync(cmd, cwd) {
  return new Promise((resolve, reject) => {
    exec(cmd, { cwd }, (err, stdout, stderr) => {
      if (err !== null) {
        reject({
          error: stderr,
        });
        return;
      }
      resolve(stdout);
    });
  });
}
module.exports = {
  cloneOrPull,
  createOutputDir,
  execAsync,
};
